参考(ctrl c+v)https://www.kancloud.cn/kancloud/the-way-to-to-go//
作为研究指出,仅记录关键点。
初始
平台和体系结构
GO语言开发团队为以下操作系统开发了一个编译器:
Linux
freebsd
Mac OS X(也称为Darwin)
目前有2个编译器:GO Native编译器GC和非本地编译器GCCGO。两个编译器都在类似Unix的系统下工作。其中,编译器的GC版本已移植到Windows平台并集成到主分布中。您也可以通过安装MINGW在Windows平台上使用GCC编译器。两个编译器都以单通道形式工作。
您可以在以下平台上获得GO 1.4源代码和二进制文件:
Linux 2.6+:AMD64,386和ARM架构
Mac OS X(Snow Leopard + Lion):AMD64和386架构
Windows 2000+:AMD64和386架构
GO环境变量
$ goroot表示GO在计算机上的安装位置。它的价值通常为$ home/go。当然,您也可以在其他地方安装它。
$ gacararch代表目标机器的处理器架构,其值可以为386,AMD64或ARM。
$ Goos代表目标机器的操作系统,其值可以是Darwin,FreeBSD,Linux或Windows。
$ Gobin代表编译器和链接器的安装位置。默认值为$ goroot/bin。如果您使用的是1.0.3及以后,则通常可以将其值设置为空。 GO将使用上述默认值。
安装目录列表
/bin:包含可执行文件,例如:编译器,GO工具
/doc:包含示例程序,代码工具,本地文档等。
/lib:包括文档模板
/MISC:包含与支持GO编辑器和CGO示例有关的配置文件
/os_arch:对象文件(.a)包含标准库的软件包
/src:包含源代码构建脚本和标准库的软件包的完整源代码(GO是开源语言)
/src/cmd:包含GO和C的编译器和命令行脚本
GO DEBUGGER
使用打印语句在适当的位置输出相关变量(PRINT/PRINTLN和FMT.PRINT/FMT.PRINTLN/FMT.PRINTF)的值。
使用fmt.printf中的以下规范打印有关变量的相关信息:%+v打印包括字段在内的实例的完整信息
%#V打印有关一个实例的完整信息,包括字段和合格的类型名称
%t打印一种类型的完整描述
使用恐慌语句(第13.2节)获取堆栈跟踪信息(所有称为功能的列表,直到恐慌)。
使用关键字延期跟踪代码执行过程(第6.4节)。
构建和运行GO程序
在大多数IDE中,在构建每个程序并保存格式的源文件之前,自动调用源格式工具GOFMT。如果构建成功,将不会输出信息。当发生编译时错误时,它将指示源代码中发生了哪种错误线,例如:声明且未使用。通常,您可以双击IDE中的错误消息,然后直接跳到发生错误的线路。
如果程序顺利执行并成功退出,则将在控制台上输出的代码0的程序将输出。
从GO 1开始,请使用go构建应用程序的更方便的工具:
去构建编译并安装自己的软件包和依赖项
去安装自己的软件包和依赖项软件包
语言的核心结构和技术
基本结构和基本数据类型
你好world
123456789package mainimport ( 'fmt')func main() { fmt.Println('hello, world')}
包的概念
Package is a way of structured code: each program consists of the concept of a package (usually referred to as pkg), and can use its own package or从其他软件包导入内容。
软件包主是指可以独立执行的程序,并且每个GO应用程序包含一个称为MAIN的软件包。
所有包装名称均应使用小写字母。
注释
//单行注释/* xxxx */多行评论
功能
您可以在括号()中编写0个或更多函数的参数(使用逗号,分离),每个参数的名称必须随后是该参数的类型。
1func sum(a,b int)int {返回a + b}
类型
基本类型:int,float,bool,string
结构化(复合):结构,阵列,切片,地图,通道
结构化类型没有实际值,它将零作为默认值使用
键入转换
类型B=B=B=B=类型的值(A型值的值)
1valueofTypeb=typeb(valueoftypea)
常量
123456牛肉,两个,c=“肉”,2,“ veg” const,星期一,星期二,星期二,星期三,星期六,星期六,星期六=1、2、2、3、4、5、5、6const(星期一,星期三,星期三,星期三,星期三,星期三,星期三,星期三,星期三,星期四,星期四,星期四,星期四,星期四,星期四,33,星期四变量,将变量的类型放在变量的名称之后
123456789111121314151617VAR标识符类型多行自动根据变量VAR的值自动推断其类型(a=15 b=false=false='go hello hello to the the the World!'numships=50 city string)并行\ cam c=5,c=5,7,abc'abc''命名法,即第一个单词是小写,每个新单词的第一个字母是大写,例如:numships and Startdate
变量(常数,类型或功能)在程序中具有一定的动作范围,称为范围。
如果在功能主体之外声明变量,则它被视为一个全局变量,可以在整个软件包,外部软件包(导出后)中使用,无论您声明哪个源文件或您在哪个源文件中调用该变量。
在功能体中声明的变量称为局部变量,其范围仅在函数体内,而参数和返回值变量也是局部变量。
变量
函数FMT.print和fmt.println使用格式标识符%V自动格式化字符串,这两者都会在每个参数之间自动添加空格,而后者也在字符串末端添加了一个newline。例如:
123fmt.print('Hello:',23)将输出:Hello: 23
打印
该变量可以在全局声明中初始化,也可以在INIT函数中进行初始化。
它不能人为地调用,但是在初始化每个软件包后会自动执行,并且执行优先级高于主函数。
源文件只能包含一个初始化功能。初始化始终以一个线程执行,并按照软件包的依赖项顺序执行。
init.go
123456789包装传输'Math'var Pi float64func init(){pi=4 * MATH.ATAN(1)//init(1)//init(init()函数pi} pi} user_init.go imports intimpt trans(在同一路径中)并使用变量pi
123456789101112 package mainimport('fmt'./trans')var twopi=2*trans.pifunc main(){fmt.printf('2*pi=%g \ n',twopi,twopi)布尔类型只能是恒定的还是错误的
数字类型:整数int和浮点浮点
格式指定符:在格式字符串中,%d用于格式化整数(%x和%x用于格式化在十六进制中表示的数字),%g用于格式化浮点(%f输出浮点数,%e输出数量floing e uptucts e Outputs Scientific Countific Counting代表),并使用%0D来指定输出固定长度长度Integer,在此中必不可少。
数值转换:当转换A32BitInt=INT32(A32Float)时,将丢弃小数点后的数字。
复数:GO具有以下复数类型:
12COMPLEX64(32位真实和虚构)复杂128(64位真实和虚构)位操作:一元操作员:逐个位置补充^,左侧移动,右移,位右移动
二进制运算符:位和位,位或|,位Xor ^,位清除^
逻辑运算符:==,=,=,=
算术运算符:可用于整数和浮点数的常见二进制运算符为+, - , *和/。
运营商和优先级:
一些操作员的优先级更高,二进制运算符的操作指示是从左到右的。下表列出了所有操作员及其优先级,从上到下,下到底到下,表示优先级从高到低:
12345678优先操作员7 ^! 6 * /% ^ 5 + - | ^ 4==!====3-2 1 ||当然,您可以通过使用括号暂时增加特定表达式的总体操作优先级。
类型别名:1Type tz int字符类型:char.go
1234567891111213VAR CH Int='\ u0041'var ch2 int='\ u03b2'var ch3 int='\ u00101234'fmt.printf('%d -%d -%d -%d -%d -%d -%d -%d -%d -%d -%d \ n',ch,ch2,ch2,ch3,ch3,ch3,ch3,ch3,ch3) CH2,CH3)//farmicfmt.printf('%x-%x -%x \ n',ch,ch2,ch3)//utf-8 bytesfmt.printf('%u -%u -%u -%u',ch,ch2,ch2,ch3,ch3)//utf -8代码点输出:65-946-10533336A--946-105332336A -R41-R4 101234U+0041 -U+03B2 -U+101234
init函数
字符串类型的零值是一个零长的字符串,即,一个空字符串''。
一般比较运算符(==,=,=,=,)实现了通过内存中字节对字符串的比较。您可以使用函数len()来获取字符串占据的字节长度,例如:len(str)。
字符串剪接字符+:两个字符串S1和S2可以通过S :=S1 +S2,S +='World'一起剪接。
解释字符串:
此类字符串包含在双引号中,相关的逃生字符将被替换,包括:
\ n:断路
\ r:马车返回
\ t:选项卡键
\ u或\ u:unicode字符
\\:后斜线本身
非解释字符串:
这类字符串封闭在背部和支持线路断裂中,例如:
1`这是一个原始的字符串\ n`将按原样输出。
基本类型和操作员
12345678911112121415161718192022222222222224252627PACKAGE MAINIMPOAGE('fmt'time'time'time'time'time'time.durationfunc main()星期三12月21日09:52:14 +0100 rst 2011 fmt.printf('%02d。%02d。%4d \ n',t.month(),t.month(),t.year(),t.year(),//21.12.212.2011 t=time.now time.now() 08:52:14 +0000 UTC 2011 FMT.PRINTLN(time.now()) T.ADD(周) //星期三12月21日08:56:34 2011 FMT.PRINTLN(T.FORMAT('02 JAN 2006 15:04'))//)//21 DEC 2011 2011 083:52 S 3:=T. format(format 08:52:14 +0000 UTC 2011=20111221}
字符串
该程序将其值存储在内存中。每个内存块(或单词)都有一个地址,该地址通常由十六进制数字表示,例如:0x6B0820或0xF84001D7F0。
指针变量可以指向任何值的内存地址。它指向该值的内存地址,在32位计算机上占据4个字节,在64位机器上占据了8个字节,并且与指向的值的大小无关。
GO语言的地址字符是,它将在将其放置在变量上之前返回相应变量的内存地址。
指针类型之前是*编号(前缀),以获取指针指向的内容。 *数字是类型更换器。使用指针参考值称为间接参考。
当定义指针并且未分配给任何变量时,其值为零。
指针变量通常缩写为PTR。
示例:显示将新值分配给*p并更改变量自己的值(这是字符串)
12345678911112131415 package mainimport'fmt'func main(){s :='good byed bye'v var p *string=s *p='ciao'fmt.printf('这是指针p:%p:%p:%p3360%p33,在这里p33 prints prints prints prints p3 3 %s \ n', *p)//打印字符串fmt.printf('这是字符串s:%s \ n',s)//same string} outter}输出:这是指针p:0x2540820在此处,在此处是字符串*p: ciaohere是字符串S3333333:11010101010101010101010101010101010101010101010101010101010101010101033333333333333333333333333333333333333333333:10010 1234567891111213141516171920212222324IF条件1 {//如果条件2 {//做某事数字,例如3'+'or%s to doiT.'func init(){如果runtime.goos=='windows'{stript=fmt.sprintf(stript,'ctrl+z,enter')} else {//unix-like提示=fmt=fmt.sprintf(提示条件1:案例条件2: default:}
时间和日期
指针
123456789Package Mainimport'fmt'func Main(){for I :=0;我5; i ++ {fmt.printf('这是%d迭代\ n',i)}}}
控制结构
,它可以迭代任何集合(包括数组和地图),其一般形式为:for IX,Val :=range coll {}。
val始终是集合中相应索引值的副本,因此它通常只有仅阅读属性,并且对其进行的任何修改都不会影响集合中的原始值(Translator的注释:如果Val是指指针,则将生成指针的副本,并且集合中的原始值仍可以修改)
123for pos,char :=范围str {.}
if-else结构
破坏动作范围是出现此陈述后的最内向结构,可以以任何形式用于循环(反,有条件判断等)。但是在开关或选择语句中,断点语句的效果是跳过整个代码块并执行后续代码。
继续忽略剩余循环主体并直接进入下一个循环的过程,但是下一个循环并未无条件执行。在执行之前,仍需要满足循环的判断条件。
开关结构
,用于,开关或选择语句可以与标签形式的标识符一起使用,即以一条线上的结肠(:)结尾的第一个单词(GOFMT将自动将后续代码移动到下一行)。
123456789 label1: for I :=0; i=5; i ++ {for J :=0; j=5; J ++ {如果J==4 {继续Label1} fmt.printf('I IS:%D,和J IS:%D \ n',I,i,j)}}}}}}}}}}}}}
对于结构
-1010 3333660010 :010
基于反迭代
10101010101010101011111111111111111111111111111111111111111111111111111111111111111111111111111111111111111马云惹不起马云191199来实间mainimport'fmt'func main(){fmt.printf('乘2 * 5 * 5 * 6=%d \ n',乘数3nums(2,5,6))//var i1 int=var i1 int=multiply3nums(2,5,5,5,6) int,c int)int {//var product int=a * b * c //返回产品返回产品a * b * c}输出显示:倍数2 * 5 * 6=60 3
范围结构
getx2andx3带有getx2andx3_2的两个函数演示如何使用非命名返回值和命名返回值。当需要返回多个非命名返回值时,需要使用(int,int)封闭它们。
12345678910111213141516171819202122232425262728package mainimport 'fmt'var num int=10var numx2, numx3 intfunc main() { numx2, numx3=getX2AndX3(num) PrintValues() //Output: num=10, 2x num=20, 3x num=30 numx2,numx3=getx2andx3_2(num)printValues()//输出:num=10,2x num=20,3x num=30} func printValues(){fmt.printf('num=%=%d,2x num=%d,2x num=%d,3x num=%d d \ n',num=%d \ n',numx got func func func func func func func inct func func func funct func func inct func functx Intup(func) int){return 2 * input,3 * input} func getx2andx3_2(input int)(x2 int,x3 int){x2=2 * input x3=3 * input //return x2,return x2,x3 return} :01
休息并继续
whitespace字符用于匹配某些不需要的值并匹配某些不良的值并使其canduct缩。 TrixValues是一个具有三个不需要任何参数的返回值的函数。在下面的示例中,我们将第一个和第三个返回值分配给I1和F1。第二个返回值分配给空白符号_,然后自动丢弃。
123456789111121314PACKAGE MAINIMPORT'fmt'func Main